07 - Optyka i działanie kamer
Wprowadzenie do przetwarzania obrazów
Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej
Ćwiczenie laboratoryjne 7: optyka kamery oraz jej kalibracja
Powrót do spisu treści ćwiczeń laboratoryjnych
Wstęp
Podczas tego laboratorium poznasz fizyczne i optyczne cechy kamery USB. Dowiesz się, jak zmiana obiektywu wpływa na kąty widzenia kamery i jej ogniskową oraz jak manipulacja przesłoną wpływa na głębie ostrości i szybkość akwizycji obrazu. W kolejnym podrozdziale przeprowadzisz kalibrację kamery.
Dane
Pobierz paczkę ze skryptami do zadań.
Obiektywy
Źródło:
Obiektywy
w systemach telewizji dozorowej.
Zbadaj jak zmienia się obraz kamery przy zmianie ogniskowej jej obiektywu. Odpowiedz na pytania: * Jaką charakterystykę obrazu tracimy zwiększając ogniskową soczewki a jaką zyskujemy? * W jakich sytuacjach korzystne jest posiadanie bardzo szerokiego kąta widzenia?
Przysłona
Przysłona ma za zadanie ograniczać ilość światła wpadającego do obiektywu, a tym samym zapobiegać „prześwietlaniu” powstającego w kamerze obrazu. Regulując przesłonę, kontrolujemy ilość światła przechodzącego przez soczewki obiektywu. Jednocześnie wpływamy na głębie ostrości otrzymanego obrazu, ponieważ wyższa wartość przesłony powoduje wyższą głębię ostrości.
Zadanie
Uruchom skrypt scripts/07/shutter.py
. Korzystając z
pokrętła zmiany przesłony na kamerze (pierścień bez śruby), ustaw
odpowiednią ilość wpadającego światła. Sprawdź, jak wpływa na obraz
dodatkowe oświetlenie (możesz wykorzystać latarkę w telefonie), a jak
jego niedobór.
Następnie zminiejszaj delikatnie rozwarcie soczewki i jednocześnie obserwuj liczbę klatek na sekundę. Zastanów się, skąd może wynikać taka zmiana?
Kalibracja kamery
Rejestratory obrazu mogą posiadać wady i niedoskonałości fabryczne, które sprawiają, że obraz jest zniekształcony. Najczęściej widocznym zniekształceniem jest efekt rybiego oka, który sprawia, że linie proste nie leżą w jednej linii. Efekt ten można zredukować, znajdując parametry wewnętrzne kamery, co nazywamy kalibracją.
Aby skutecznie przeprowadzić kalibrację kamery, potrzebny jest obiekt o znanych kształtach i rozmiarach. Najczęściej jest to jednak tablica z naniesioną szachownicą. W naszym przypadku jest to szachownica 8x5, gdyż liczymy wewnętrzne narożniki.
Znany wzorzec jest wielokrotnie rejestrowany, z możliwie różnych kątów oraz pozycji kamery, zwłaszcza na skrajnych częściach obrazu. Pozwoli to zróżnicować dane i dobrać najlepsze dopasowanie.
Jak liczyć wielkość macierzy kalibracyjnej?
W przypadku tarczy kalibracyjnej typu szachownica, liczbę kolumn i wierszy wyznacza się licząc miejsca styczne narożników czarnych kwadratów. W naszym przypadku jest to 8x5.
W przypadku tarczy kalibracyjnej typu koło, jest to delikatnie bardziej skomplikowane. Liczbę kolumn wyznacza się licząc liczbę kół w pierwszych dwóch rzędach. Natomiast w przypadku wierszy, bierzemy pod uwagę tylko liczbę kół w jednej kolumnie. W naszym przypadku jest to 9x3.
Zadanie
Wykorzystaj skrypt
scripts/07/calibration/1_collect_images.py
do zebrania
zbioru kalibracyjnego. Program został tak napisany, żeby po wciśnięciu
klawisza spacja
, zapisać obecną klatkę do katalogu
frames
. Zbierz między 40 a 80 zdjęć, postaraj się, by były
one zróżnicowane i ostre. Klawisz q
pozwoli zakończyń
program.
Edytuj skrypt
scripts/07/calibration/2_find_chessboard.py
by ustawić
zmienną GRID_SIZE
odpowiadającą twojej tarczy
kalibracyjnej, następnie uruchom go. Wyszuka on na każdym obrazie punkty
charakterystyczne szachownicy oraz zwizualizuje. Następnie rozpocząnie
się kalibracja (może potrwać to kilka minut przy większej liczbie
zdjęć). Po prawidłowej kalibracji algorytm wypisze w terminalu parametry
wewnętrzne kamery. Zachowaj je.
Uwaga: Optyka kamery powinna pozostać niezmieniona w trakcie zbierania zdjęć oraz po przeprowadzeniu procesu kalibracji. Każdorazowa zmiana parametrów wymaga zebrania nowego zestawu zdjęć oraz wykonania ponownej kalibracji.
Uzupełnij w skrypcie
scripts/07/calibration/3_show_calibrated_camera.py
słownik
cfg
korzystając z obliczonych parametrów wewnętrznych
kamery. Uruchom skypt i korzystając z klawisza spacja
zmień
tryby wyświetlania. Czy obraz został w widoczny sposób poprawiony?
Sprawdź czy zmiana głębi oraz zoomu w kamerze wymaga jej ponownej
kalibracji.
Efekt przedstawiono na filmie.
Obraz pseudo-3D
Kalibracja kamery pozwala na wykorzystanie narzędzi wprowadzających pseudo obraz 3D, który jest podstawą rozszerzonej rzeczywistości (ang. augmented reality, AR). Prostym narzędziem wykorzystywanym w robotyce są kody aruco, do których są wbudowane w opencv metody ich detekcji, lokalizacji oraz deskrypcji. Przykładowe zastosowania przedstawiono tutaj, tutaj, tutaj i tutaj.
Zadanie
Upewnij się, że w swoim środowisku masz zainstalowaną bibliotekę
opencv-contrib-python
.
Wykorzystaj skrypt aruco_ar.py
by wyświetlić modele
sześcianów nałożonych na kody aruco. Twoim zadaniem jest wykorzystać
informację o id wykrytego znacznika aruco_id
oraz
pokolorować boxa na różne kolory aruco_color
.
Opcjonalnie
Pobierz na telefon plik pdf (lub kilka) z kodem Aruco i sprawdź ich
działanie. Zastanów się, jakie widzisz zastosowanie w robotyce a jakie w
automatyce? Przykładowy rezultat przedstawiono na filmie.
- pdf z Aruco tagiem o id-0
- pdf z Aruco tagiem o id-1
- pdf z Aruco tagiem o id-2
- pdf z Aruco tagiem o id-3
Sklejanie obrazów (panorama)
W opencv został zaimplementowany algorytm, który pozwala na
dopasowanie wielu obrazów do siebie. Jest to klasa
cv2.Stitcher_create
, która wykonuje dla zdjęć następujące
kroki: - wykrywa punkty charakterystyczne na obrazie i używa
deskryptorów do ich opsu, - dopasowuje te punkty między obrazami na
podstawie podobieństwa, - wykorzystuje dopasowane punkty oraz algorytm
RANSAC do wyliczania macierzy przekształceń dla obrazów, by móc je
dopasować do siebie - wykonuje sklejenie obrazów na podstawie macierzy
przekształceń.
Więcej informacji o tym mechaniźmie można znaleźć w tym artykule.
Zadanie
Korzystając ze skrytpu image_stitching.py
, zbierz
pokrywajce się częściowo zdjęcia (przy użyciu klawisza spacji), a
następnie wciśnij klawisz c
, który rozpoczyna proces
generowania panoramy. Zwróć uwagę na dokładoność łączenia na
krawędziach. Uwaga: Zadanie dopasowywania cech jest
bardzo zasobożerne, więc może długo trwać jeśli zostało wykonane wiele
zdjęć.
Zadanie
Kalibracja kamery ma wiele zalet, pozwala na przykład estymować pozę kamery względem znacznika. Znacznik może być zefiniowany lub wykorzystywać można charakterystyczne cechy. Na tym filmiku możesz podejrzeć, jak drone jest automatycznie nakierowywany na znany mu znacznik do lądowania.
Twoim zadaniem będzie napisanie takiego programu, przy czym znaczna jego częśc jest już zaimplementowana. Przykładowe działanie możesz podejrzeć na tym nagraniu. Identyczny znacznik do testowania znajduje się nad waszymi głowami.
- W skrypcie
track_position.py
uzupełnij:
zmienną
CAMERA_ID
która identyfikuje kamerę, którą chcesz wykorzystać. Jeśli podłączona jest jedna kamera, to wartość 0, jeśli dwie, to 0 i 1 lub 0 i 2.skopiuj z poprzednich zadań macierz kalibracyjną kamery ustawiając słownik
cfg
.uzupełnij funkcję
canny_edge_detection
tak, by zwracała obraz z wykrytymi krawędziami. Szczegółowe kroki:- przefiltruj obraz za pomocą
cv2.GaussianBlur
z rozmiarem jądra 5x5 - przekonwertuj obraz do skali szarości
- wykorzystaj funkcję
cv2.Canny
do wykrycia krawędzi, użytając progów 50 i 60 - zastosuj morfologiczne zamknięcie z jądrem 3x3
- zwróć obraz z krawędziami
- przefiltruj obraz za pomocą
uruchom skrypt kierując kamere na znacznik. Sprawdź, czy krawędzie są wykrywane poprawnie.